package com.jifen.utils;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.HashMap;
import java.util.Map;

public class SmsUtils {
    //产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";

    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    static final String accessKeyId = "LTAIz9pkv7meVteM";
    static final String accessKeySecret = "F6XVccIvkdx3FE9rnNbwbcPIiXNQ5v";

    public static Map<String, String> sendSms(String mobile, String templateCode, JSONObject param) {
        Map<String, String> map = new HashMap<String, String>();
        try {
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");

            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);

            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(mobile);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName("东恒");
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(templateCode);
            SendSmsResponse sendSmsResponse = null;
            if(param==null) {
                //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
                String generateSource = "0123456789";
                String rtnStr = "";
                for (int i = 0; i < 6; i++) {
                    // 循环随机获得当次字符，并移走选出的字符
                    String nowStr = String
                            .valueOf(generateSource.charAt((int) Math.floor(Math.random() * generateSource.length())));
                    rtnStr += nowStr;
                    generateSource = generateSource.replaceAll(nowStr, "");
                }
                String value = rtnStr;
                request.setTemplateParam("{\"code\":\"" + value + "\"}");
                System.out.println(mobile+"-验证码：" + value);
                sendSmsResponse = acsClient.getAcsResponse(request);
                if (sendSmsResponse.getCode().equals("OK")) {
                    map.put("value", value);
                }
            }else{
                request.setTemplateParam(param.toJSONString());
                sendSmsResponse = acsClient.getAcsResponse(request);
            }
            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            // request.setOutId("yourOutId");


            if (!sendSmsResponse.getCode().equals("OK")) {
                String message = sendSmsResponse.getMessage();
                System.out.println("message=" + message);
                if (message.indexOf("触发分钟级流控") != -1) {
                    System.out.println("触发分钟级流控");
                    map.put("msg", "发送失败，已超出短信限制发送条数");
                    return map;
                } else if (message.indexOf("触发小时级流控") != -1) {
                    System.out.println("触发小时级流控");
                    map.put("msg", "发送失败，已超出短信限制发送条数");
                    return map;
                } else if (message.indexOf("触发天级流控") != -1) {
                    System.out.println("触发天级流控");
                    map.put("msg", "发送失败，已超出短信限制发送条数");
                    return map;
                } else{
                    map.put("msg", sendSmsResponse.getMessage());
                    return map;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return map;
    }

    public static void main(String[] args) throws ClientException, InterruptedException{
        JSONObject param = new JSONObject();
        param.put("password", "123");
        System.out.println(sendSms("18908093314", "SMS_169102553", param));
    }

/*    public static void main(String[] args) throws ClientException, InterruptedException {

        //发短信
        SendSmsResponse response = sendSms();
        System.out.println("短信接口返回的数据----------------");
        System.out.println("Code=" + response.getCode());
        System.out.println("Message=" + response.getMessage());
        System.out.println("RequestId=" + response.getRequestId());
        System.out.println("BizId=" + response.getBizId());

    }*/
}
